/**
 * 自定义功能
 */
String.prototype.toBool = function () {
  const result = this.match(/^\s*(true|false)\s*$/i);
  if(null === result){
    throw new Error("字符串[" + this + "]不能转换为布尔类型")
  }
  return (/^true$/i).test(result[1]);
}
/**
 * 判断一个字符串是以指定字符串结尾
 */
if (typeof String.prototype.endWith != 'function') {
  String.prototype.endWith = function (endStr) {
    var d = this.length - endStr.length;
    return (d >= 0 && this.lastIndexOf(endStr) == d)
  }
}
/**
 * 判断一个字符串是以某个字符串开头
 */
if (typeof String.prototype.startsWith != 'function') {
  String.prototype.startsWith = function (prefix) {
    return this.slice(0, prefix.length) === prefix;
  };
}
/**
 * 为字符串添加 trim 功能
 */
if (typeof String.prototype.trim != 'function') {
  String.prototype.trim = function () {
    return this.replace(/^\s+|\s+$/gm, '');
  }
}

/**
 * 转换为数字
 * 1. 转换成功返回数字
 * 2. 转换失败返回NaN
**/
function toNumber(val) {
  // isNaN()函数 把空串 空格 以及NUll 按照0来处理 所以先去除，
  if (val === undefined || val === null || val.trim() === "") {
    return NaN;
  }
  return Number(val);
}

/**
 * 判断类型
 * 
 * 调用方法：
 * Type.IsFunction(function() {})
 * Type.IsObject({})。。。。。
 */
var Type = (function () {
  var type = {};
  var typeArr = ['String', 'Object', 'Number', 'Array', 'Undefined', 'Function', 'Null', 'Symbol'];
  for (var i = 0; i < typeArr.length; i++) {
    (function (name) {
      type['Is' + name] = function (obj) {
        return Object.prototype.toString.call(obj) == '[object ' + name + ']';
      }
    })(typeArr[i]);
  }
  return type;
})();
/**
 * 暴露接口
 */
module.exports = {
  toNumber,
  Type
}